#!/bin/bash

# 通用子模块镜像管理器 (Shell 版本)
# 自动发现、评估和配置最优镜像

set -e

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'

# 镜像源配置
MIRROR_PROVIDERS=(
    "https://gitee.com/mirrors/{repo_name}"
    "https://gitee.com/uesoft/{repo_name}" 
    "https://gitcode.com/mirrors/{repo_name}"
)

# 日志函数
log_info() {
    echo -e "${BLUE}ℹ ${NC}$1"
}

log_success() {
    echo -e "${GREEN}✅ ${NC}$1"
}

log_warning() {
    echo -e "${YELLOW}⚠ ${NC}$1"
}

log_error() {
    echo -e "${RED}❌ ${NC}$1"
}

# 提取仓库名称
extract_repo_name() {
    local url="$1"
    local repo_name
    
    # 移除 .git 后缀
    url="${url%.git}"
    
    # 从URL中提取仓库名
    if [[ "$url" =~ github\.com/([^/]+)/([^/]+)$ ]]; then
        repo_name="${BASH_REMATCH[2]}"
    elif [[ "$url" =~ gitlab\.com/([^/]+)/([^/]+)$ ]]; then
        repo_name="${BASH_REMATCH[2]}"
    else
        # 其他情况，取最后一部分
        repo_name="${url##*/}"
    fi
    
    echo "$repo_name"
}

# 评估镜像可用性 - 简化修复版本
evaluate_mirror() {
    local mirror_url="$1"
    local original_url="$2"
    local score=0
    
    echo -e "    评估: $mirror_url" >&2
    
    # 检查镜像是否存在
    if git ls-remote "$mirror_url" &>/dev/null; then
        # 获取标签数量作为评分
        local tag_count
        tag_count=$(git ls-remote --tags "$mirror_url" 2>/dev/null | wc -l)
        
        # 根据标签数量评分
        if [ "$tag_count" -gt 100 ]; then
            score=100
            echo -e "    评估: $mirror_url ... ${GREEN}✅ 优秀 ($tag_count 标签)${NC}" >&2
        elif [ "$tag_count" -gt 50 ]; then
            score=80
            echo -e "    评估: $mirror_url ... ${GREEN}✅ 良好 ($tag_count 标签)${NC}" >&2
        elif [ "$tag_count" -gt 10 ]; then
            score=60  
            echo -e "    评估: $mirror_url ... ${YELLOW}⚠ 一般 ($tag_count 标签)${NC}" >&2
        else
            score=40
            echo -e "    评估: $mirror_url ... ${YELLOW}⚠ 基础 ($tag_count 标签)${NC}" >&2
        fi
    else
        echo -e "    评估: $mirror_url ... ${RED}❌ 不可用${NC}" >&2
        score=0
    fi
    
    echo "$score"
}

# 寻找最优镜像
find_best_mirror() {
    local original_url="$1"
    local repo_name
    repo_name=$(extract_repo_name "$original_url")
    
    log_info "为 $repo_name 寻找最优镜像..."
    
    local best_mirror=""
    local best_score=0
    
    for provider in "${MIRROR_PROVIDERS[@]}"; do
        # 生成可能的镜像URL变体
        local mirror_variants=(
            "$(echo "$provider" | sed "s/{repo_name}/$repo_name/g")"
            "$(echo "$provider" | sed "s/{repo_name}/lib$repo_name/g")"
        )
        
        for mirror_url in "${mirror_variants[@]}"; do
            local score
            score=$(evaluate_mirror "$mirror_url" "$original_url")
            
            # 使用安全的整数比较
            if [ "$score" -gt "$best_score" ]; then
                best_score="$score"
                best_mirror="$mirror_url"
            fi
        done
    done
    
    if [ "$best_score" -gt 0 ]; then
        log_success "找到最优镜像: $best_mirror (得分: $best_score)"
        echo "$best_mirror"
    else
        log_error "未找到合适镜像 (最佳得分: $best_score)"
        echo ""
    fi
}

# 配置镜像替换
configure_mirror() {
    local original_url="$1"
    local mirror_url="$2"
    
    if [ -n "$mirror_url" ]; then
        log_info "配置镜像: $original_url -> $mirror_url"
        git config --global "url.$mirror_url.insteadof" "$original_url"
        log_success "镜像配置成功"
    else
        log_warning "跳过配置: 未找到合适镜像"
    fi
}

# 处理所有子模块
process_all_submodules() {
    log_info "开始处理所有子模块"
    
    local success_count=0
    local total_count=0
    
    # 获取所有子模块
    git config --file .gitmodules --get-regexp path | while read -r key path; do
        total_count=$((total_count + 1))
        local url_key="${key%.path}.url"
        local original_url
        original_url=$(git config --file .gitmodules --get "$url_key")
        
        log_info "处理子模块: $path"
        log_info "原始 URL: $original_url"
        
        local best_mirror
        best_mirror=$(find_best_mirror "$original_url")
        
        if [ -n "$best_mirror" ]; then
            configure_mirror "$original_url" "$best_mirror"
            success_count=$((success_count + 1))
        else
            log_error "无法为该子模块找到合适镜像"
        fi
        
        echo
    done
    
    log_info "处理完成"
    log_success "成功配置: $success_count/$total_count 个子模块"
}

# 检查当前配置
check_current_config() {
    log_info "检查镜像配置"
    git config --global --get-regexp "url.*.insteadof" || log_info "暂无镜像配置"
}

# 初始化子模块
init_submodules() {
    log_info "初始化子模块"
    git submodule update --init --recursive --progress
}

# 显示帮助
show_help() {
    cat << 'HELP_EOF'
通用子模块镜像管理器 (Shell 版本)
自动发现、评估和配置最优镜像

使用方法: $0 <command>

命令:
  setup   为所有子模块自动寻找并配置最优镜像
  init    初始化子模块（使用配置的镜像）
  check   检查当前镜像配置
  test <url>  测试单个项目的镜像发现
  help    显示此帮助信息
HELP_EOF
}

# 主函数
main() {
    local command="${1:-help}"
    
    case "$command" in
        setup)
            process_all_submodules
            ;;
        init)
            init_submodules
            ;;
        check)
            check_current_config
            ;;
        test)
            local test_url="$2"
            if [ -z "$test_url" ]; then
                log_error "请提供测试URL"
                show_help
                exit 1
            fi
            echo "=== 测试镜像发现: $test_url ==="
            find_best_mirror "$test_url"
            ;;
        help|*)
            show_help
            ;;
    esac
}

# 运行主函数
main "$@"
